S14-03 SSR-Nuxt3-项目:mr-ssr-nuxt3-ts-oppo
[TOC]
接口文档
首页信息
说明 : 调用此接口 , 获取首页商品信息
请求方法 : GET
接口地址 : /home/info
可选参数 :
type: 商品类型,支持: oppo 、onePlus、intelligent, 默认是oppo
调用例子 : baseURL + /home/info?type=oppo
{
"code": 200,
"data": {
"navbars": [
],
"banners":[
],
"categorys":[
]
}
}
商品详情
说明 : 调用此接口 , 获取商品详情信息
请求方法 : GET
接口地址 : /oppoDetail
可选参数 :
type: 类型:oppo 、air、watch、tablet, 默认是oppo
调用例子 : baseURL + /oppoDetail?type=oppo
{
"code": 200,
"data": [
{
"id": 19978,
"title": "Enco X 系列",
"productDetailss": [
{
"categoryCode": "000020",
"id": 21452,
"title": "OPPO Enco X2 镜夜黑 有线充版",
"marketingText": "45dB 降噪深度",
"skuId": 8687,
"skuName": "OPPO Enco X2 镜夜黑 有线充版",
.....
}
]
}
]
}
环境搭建
项目初始化
pnpm dlx nuxi init mr-ssr-nuxt3-oppo
集成-样式▸
依赖包:
- normalize.css
- 安装:
pnpm i normalize.css
- 安装:
- sass
- 安装:
pnpm i sass
- 安装:
配置: 全局引入 normalize.css
自定义全局样式:
global.scss
1、定义全局样式global.scss
2、添加配置,使全局有效
variables.scss
1、定义全局样式变量
2、设置配置,自动导入全局样式变量
3、在组件中使用变量、混合
代码片段
集成-ElementPlus2▸
Element Plus 官网:https://element-plus.org/zh-CN/guide/quickstart.html
安装文档:https://nuxt.com.cn/modules/element-plus
依赖包:
- element-plus
- 安装:
pnpm i element-plus
- 安装:
- @element-plus/nuxt
- 安装:
pnpm i @element-plus/nuxt -D
- 安装:
步骤:
1、安装依赖包
2、在nuxt.config.ts
中设置配置
export default defineNuxtConfig({
modules: [
'@element-plus/nuxt'
],
elementPlus: {
/** Options */
icon: 'ElIcon',
importStyle: 'scss',
themes: ['dark'],
}
})
早期配置:组件中使用需要手动导入
3、在组件中使用element-plus组件,【是否是自动导入?】
<template>
<el-button @click="ElMessage('hello')">button</el-button>
<ElButton :icon="ElIconEditPen" type="success">button</ElButton>
<LazyElButton type="warning">lazy button</LazyElButton>
</template>
Options:
【TODO】
SEO▸
404处理▸
在pages
目录中创建[...slug].vue
页面,匹配所有找不到页面的路由
网络请求封装▸
import type { AsyncData, UseFetchOptions } from "nuxt/dist/app/composables";
const BASE_URL = "http://codercba.com:9060/oppo-nuxt/api/";
type Methods = "GET" | "POST";
export interface IResultData<T> {
code: number;
data: T;
}
class HYRequest {
request<T = any>(
url: string,
method: Methods,
data?: any,
options?: UseFetchOptions<T>
): Promise<AsyncData<T, Error>> {
return new Promise((resolve, reject) => {
const newOptions: UseFetchOptions<T> = {
baseURL: BASE_URL,
method: method,
...options,
};
if (method === "GET") {
newOptions.query = data;
}
if (method === "POST") {
newOptions.body = data;
}
useFetch<T>(url, newOptions as any)
.then((res) => {
resolve(res as AsyncData<T, Error>);
})
.catch((error) => {
reject(error);
});
});
}
get<T = any>(url: string, params?: any, options?: UseFetchOptions<T>) {
return this.request<T>(url, "GET", params, options);
}
post<T = any>(url: string, data?: any, options?: UseFetchOptions<T>) {
return this.request<T>(url, "POST", data, options);
}
}
export default new HYRequest();
使用
import hyRequest from "./index";
import type { IResultData } from "./index";
import { IHomeState } from "@/store/home";
export type IHomeInfoType = "oppo" | "onePlus" | "intelligent"; // oppo 、onePlus、intelligent
export const getHomeInfo = (type: IHomeInfoType) => {
return hyRequest.get<IResultData<IHomeState>>("/home/info", {
type: type || "oppo",
});
};
集成-Pinia
依赖包:
- pinia
- 安装:
pnmp i pinia
,有冲突则添加--force
- 安装:
- @pinia/nuxt
- 安装:
pnmp i @pinia/nuxt
- 安装:
步骤:
1、安装依赖包
2、配置:nuxt.config.ts
Layout
接口
说明 : 调用此接口 , 获取首页商品信息
请求方法 : GET
接口地址 : /home/info
可选参数 :
type: 商品类型,支持: oppo 、onePlus、intelligent, 默认是oppo
调用例子 : baseURL + /home/info?type=oppo
{
"code": 200,
"data": {
"navbars": [
],
"banners":[
],
"categorys":[
]
}
}
Layout
1、在项目的layout/default.vue
中编写layout
2、创建components/app-header/index.vue
组件
3、创建components/app-footer/index.vue
组件
4、在app.vue
中使用layout
组件:app-header
页面布局
功能
字体图标▸
必须文件:
iconfont.css
iconfont.ttf
iconfont.css
1、修改字体文件路径
2、配置全局应用字体图标样式
3、在组件中使用字体图标
自定义布局▸
1、在layout
目录创建empty-layout.vue
页面
2、在login/index.vue
和register/index.vue
中指定使用自定义的布局
3、效果
组件:app-footer
组件:navbar
页面布局
1、页面布局
2、在layout中使用组件
请求数据▸
1、server:在server/home.ts
中发送请求
2、store:在store/home.ts
中发送异步请求
TS类型: 为请求的数据定义TS类型
3、组件:在~/layouts/default.vue
中触发store中的action
功能
渲染数据
1、在~/layouts/default.vue
中获取store中的数据,并传递给navbar
组件
2、在navbar
组件中接收数据,并渲染
切换标签
1、在navbar
组件中添加点击事件
2、实现点击事件,切换标签
路由跳转-组件式
1、在navbar
组件中为链接的to
属性添加动态获取path的方法getPagePath(item)
2、实现getPagePath(item)
方法,完成路由跳转
组件:search
页面布局
1、使用组件
2、在components/search/index.vue
中创建组件
login【
页面布局
1、点击跳转到login页面
register【
home
页面布局
组件:swiper
页面布局
1、使用组件
2、接收props,并渲染
功能
指示器
组件:tab-category
页面布局
1、使用组件
2、接收数据,并渲染
功能
路由跳转-编程式
1、定义点击事件handleItemClick()
,向外发射itemClick
事件
2、在外部接收itemClick
事件
组件:section-category
页面布局
1、使用组件
2、页面布局
组件:section-title
页面布局
1、使用组件
2、页面布局
组件:grid-view
页面布局
1、使用组件
2、页面布局
组件:grid-view-item
1、使用组件
2、页面布局
功能
第一个item
1、使用组件:传递参数category-url
2、页面布局:接收参数并渲染
3、控制第一个item是否显示
添加插槽
其他页
onePlus
注意
该页面结构和home页基本一致,很多组件都可以复用
intelligent
server【
详情页
接口
说明 : 调用此接口 , 获取商品详情信息
请求方法 : GET
接口地址 : /oppoDetail
可选参数 :
type: 类型:oppo 、air、watch、tablet, 默认是oppo
调用例子 : baseURL + /oppoDetail?type=oppo
{
"code": 200,
"data": [
{
"id": 19978,
"title": "Enco X 系列",
"productDetailss": [
{
"categoryCode": "000020",
"id": 21452,
"title": "OPPO Enco X2 镜夜黑 有线充版",
"marketingText": "45dB 降噪深度",
"skuId": 8687,
"skuName": "OPPO Enco X2 镜夜黑 有线充版",
.....
}
]
}
]
}
请求数据
1、server:在~/server/detail.ts
中发送请求
2、组件:在~/oppo-details/index.ts
中发送异步请求
页面布局
1、页面跳转:在index.vue
中进行路由跳转
2、页面布局
打包部署
打包项目
1、执行pnpm run build
命令打包项目,项目会打包到/.output/
目录
注意: 打包nuxt项目时不能出现中文路径,主要因为Nitro
不支持中文路径。
购买-阿里云服务器
阿里云服务器购买地址:https://aliyun.com/
1、打开控制台
2、菜单找到:云服务器 ECS
3、创建我们 ECS
4、服务器的配置
- CentOS 7.9 / 64
- 2cpu 4G
5、配置安全组
6、系统配置,自定义密码
7、确认订单,创建实例
连接-阿里云服务器
1、VS Code 安装:Remote SSH 插件
2、Remote SSH 连接远程服务器
安装 Node
见: 安装nodejs
安装n
见:安装n
安装pm2
见:安装pm2